package com.ssy.lingxi.order.service.web;

import com.ssy.lingxi.common.model.dto.UserLoginCacheDTO;
import com.ssy.lingxi.common.response.PageData;
import com.ssy.lingxi.common.response.Wrapper;
import com.ssy.lingxi.order.entity.OrderDO;
import com.ssy.lingxi.order.model.vo.basic.request.*;
import com.ssy.lingxi.order.model.vo.basic.response.*;
import com.ssy.lingxi.order.model.vo.buyer.response.BuyerOrderPayNodeDetailVO;
import com.ssy.lingxi.order.model.vo.vendor.request.*;
import com.ssy.lingxi.order.model.vo.vendor.response.*;
import org.springframework.http.HttpHeaders;

import javax.servlet.http.HttpServletResponse;
import java.util.List;

/**
 * 销售订单相关接口
 * @author 万宁
 * @version 2.0.0
 * @date 2021-07-19
 */
public interface IVendorOrderService {
    /**
     * （待分配订单页面） 获取前端页面下拉框列表
     * @param headers Http头部信息
     * @return 查询结果
     */
    Wrapper<List<DropdownItem>> getTakePageItems(HttpHeaders headers);

    /**
     * “待分配订单” - 查询订单列表
     * @param headers  Http头部信息
     * @param pageVO 接口参数
     * @return 查询结果
     */
    Wrapper<PageData<BaseVendorOrderQueryVO>> pageToTakeOrders(HttpHeaders headers, OrderPageVO pageVO);

    /**
     * “待分配订单” - 订单详情
     * @param headers Http头部信息
     * @param idVO 接口参数
     * @return 查询结果
     */
    Wrapper<VendorOrderDetailVO> getToTakeOrderDetail(HttpHeaders headers, OrderIdVO idVO);

    /**
     * “待分配订单” - 领取订单
     * @param headers Http头部信息
     * @param idVO 接口参数
     * @return 操作结果
     */
    Wrapper<Void> takeOrder(HttpHeaders headers, OrderIdVO idVO);

    /**
     * “待分配订单” - 批量领取订单
     * @param headers Http头部信息
     * @param orderIds 订单Id列表
     * @return 操作结果
     */
    Wrapper<Void> batchTakeOrders(HttpHeaders headers, List<OrderIdVO> orderIds);

    /**
     * "待核销自提订单" - 分页查询订单列表
     * @param headers Http头部信息
     * @param pageVO  接口参数
     * @return 查询结果
     */
    Wrapper<PageData<VendorVerifyOrderQueryVO>> pageVerifyOrders(HttpHeaders headers, VendorVerifyOrderPageVO pageVO);

    /**
     * "待核销自提订单" - 核销自提订单
     * @param headers Http头部信息
     * @param orderVO 接口参数
     * @return 查询结果
     */
    Wrapper<Void> validateVerifyOrder(HttpHeaders headers, VendorVerifyOrderVO orderVO);

    /**
     * （订单查询页面）获取前端页面下拉框列表
     * @param headers Http头部信息
     * @return 查询结果
     */
    Wrapper<PageItemVO> getPageItems(HttpHeaders headers);

    /**
     * 分页查询订单
     * @param headers Http头部信息
     * @param pageVO 接口参数
     * @return 查询结果
     */
    Wrapper<PageData<VendorOrderQueryVO>> pageOrders(HttpHeaders headers, OrderManagePageVO pageVO);

    /**
     * 订单查询导出
     * @param token 登录token
     * @param pageVO 接口参数
     * @param response 响应体
     */
    void exportOrders(HttpServletResponse response, OrderManagePageVO pageVO, String token);

    /**
     * 订单详情
     * @param headers Http头部信息
     * @param idVO 接口参数
     * @return 查询结果
     */
    Wrapper<VendorOrderDetailVO> getOrderDetail(HttpHeaders headers, OrderIdVO idVO);

    /**
     * 查询订单优惠券记录
     * @param headers Http头部信息
     * @param orderIdVO 接口参数
     * @return 查询结果
     */
    Wrapper<List<VendorOrderCouponVO>> findOrderCoupons(HttpHeaders headers, OrderIdVO orderIdVO);

    /**
     * 查询订单商品的营销活动记录
     * @param headers Http头部信息
     * @param productIdVO 接口参数
     * @return 查询结果
     */
    Wrapper<PageData<VendorOrderProductPromotionVO>> findOrderProductPromotions(HttpHeaders headers, OrderProductIdVO productIdVO);

    /**
     * 中止订单
     * @param headers Http头部信息
     * @param reasonVO 接口参数
     * @return 操作结果
     */
    Wrapper<Void> terminateOrder(HttpHeaders headers, OrderReasonVO reasonVO);

    /**
     * 取消订单
     * @param headers Http头部信息
     * @param reasonVO 接口参数
     * @return 操作结果
     */
    Wrapper<Void> cancelOrder(HttpHeaders headers, OrderReasonVO reasonVO);

    /**
     * 取消订单
     * @param orderId 订单Id
     * @param userName 用户名
     * @param organizationName 组织机构名称
     * @param jobTitle 职位
     * @param roleName 角色名称
     * @param reason 取消原因
     * @return 操作结果
     */
    Wrapper<Void> cancelOrder(Long orderId, String userName, String organizationName, String jobTitle, String roleName, String reason);

    /**
     * 取消订单
     * @param order 订单
     * @param userName 用户名
     * @param organizationName 组织机构名称
     * @param jobTitle 职位
     * @param roleName 角色名称
     * @param reason 取消原因
     * @return 操作结果
     */
    Wrapper<Void> cancelOrder(OrderDO order, String userName, String organizationName, String jobTitle, String roleName, String reason);

    /**
     * “转单” - 预览转单订单列表
     * @param headers Http头部信息
     * @param transferOrderVO 接口参数
     * @return 查询结果
     */
    Wrapper<List<VendorTransferOrderQueryVO>> preTransferOrders(HttpHeaders headers, VendorTransferOrderVO transferOrderVO);

    /**
     * “转单” - 确认转单
     * @param headers Http头部信息
     * @param transferOrderVO 接口参数
     * @return 操作结果
     */
    Wrapper<Void> transferOrders(HttpHeaders headers, VendorTransferOrderVO transferOrderVO);

    /**
     * 生成支付链接
     * @param headers Http头部信息
     * @param idVO    接口参数
     * @return 操作结果
     */
    Wrapper<GeneratePayLinkVO> generatePayLink(HttpHeaders headers, OrderIdVO idVO);

    /**
     * （订单审核各个页面）获取前端页面下拉框列表
     * @param headers Http头部信息
     * @return 查询结果
     */
    Wrapper<ValidatePageItemVO> getValidatePageItems(HttpHeaders headers);

    /**
     * “待提交审核订单” - 查询订单列表
     * @param headers Http头部信息
     * @param pageVO 接口参数
     * @return 查询结果
     */
    Wrapper<PageData<OrderPageQueryVO>> pageSubmitToConfirmOrders(HttpHeaders headers, OrderValidatePageVO pageVO);

    /**
     * “待提交审核订单” - 查询订单详情
     * @param headers Http头部信息
     * @param idVO 接口参数
     * @return 查询结果
     */
    Wrapper<VendorOrderDetailVO> getSubmitToConfirmOrderDetails(HttpHeaders headers, OrderIdVO idVO);

    /**
     * “分页查询订单列表、待提交审核订单” - 修改运费和商品价格
     * @param headers Http头部信息
     * @param freightVO 接口参数
     * @return 查询结果
     */
    Wrapper<Void> updateFreightAndProductPrices(HttpHeaders headers, VendorUpdateFreightVO freightVO);

    /**
     * “待提交审核订单” - 修改支付比例
     * @param headers Http头部信息
     * @param payRateVO 接口参数
     * @return 查询结果
     */
    Wrapper<Void> updatePayRate(HttpHeaders headers, VendorUpdatePayRateVO payRateVO);

    /**
     * “待提交审核订单” - 提交审核
     * @param headers Http头部信息
     * @param agreeVO 接口参数
     * @return 查询结果
     */
    Wrapper<Void> submitToConfirmOrder(HttpHeaders headers, OrderAgreeVO agreeVO);

    /**
     * “待审核订单（一级）” - 查询订单列表
     * @param headers Http头部信息
     * @param pageVO 接口参数
     * @return 查询结果
     */
    Wrapper<PageData<OrderPageQueryVO>> pageToValidateGradeOneOrders(HttpHeaders headers, OrderValidatePageVO pageVO);

    /**
     * “待审核订单（一级）” - 查询订单详情
     * @param headers Http头部信息
     * @param idVO 接口参数
     * @return 查询结果
     */
    Wrapper<VendorOrderDetailVO> getToValidateGradeOneOrderDetails(HttpHeaders headers, OrderIdVO idVO);

    /**
     * “待审核订单（一级）” - 提交审核
     * @param headers Http头部信息
     * @param agreeVO 接口参数
     * @return 查询结果
     */
    Wrapper<Void> validateOrderGradeOne(HttpHeaders headers, OrderAgreeVO agreeVO);

    /**
     * “待审核订单（一级）” - 批量审核
     * @param headers Http头部信息
     * @param orderIds 接口参数
     * @return 审核结果
     */
    Wrapper<Void> batchValidateOrdersGradeOne(HttpHeaders headers, List<OrderIdVO> orderIds);

    /**
     * “待审核订单（二级）” - 查询订单列表
     * @param headers Http头部信息
     * @param pageVO 接口参数
     * @return 查询结果
     */
    Wrapper<PageData<OrderPageQueryVO>> pageToValidateGradeTwoOrders(HttpHeaders headers, OrderValidatePageVO pageVO);

    /**
     * “待审核订单（二级）” - 查询订单详情
     * @param headers Http头部信息
     * @param idVO 接口参数
     * @return 查询结果
     */
    Wrapper<VendorOrderDetailVO> getToValidateGradeTwoOrderDetails(HttpHeaders headers, OrderIdVO idVO);

    /**
     * “待审核订单（二级）” - 提交审核
     * @param headers Http头部信息
     * @param agreeVO 接口参数
     * @return 查询结果
     */
    Wrapper<Void> validateOrderGradeTwo(HttpHeaders headers, OrderAgreeVO agreeVO);

    /**
     * “待审核订单（一级）” - 批量提交审核
     * @param headers Http头部信息
     * @param orderIds 接口参数
     * @return 查询结果
     */
    Wrapper<Void> batchValidateOrdersGradeTwo(HttpHeaders headers, List<OrderIdVO> orderIds);

    /**
     * “待确认订单” - 查询订单列表
     * @param headers Http头部信息
     * @param pageVO 接口参数
     * @return 查询结果
     */
    Wrapper<PageData<OrderPageQueryVO>> pageToConfirmOrders(HttpHeaders headers, OrderValidatePageVO pageVO);

    /**
     * “待确认订单” - 查询订单详情
     * @param headers Http头部信息
     * @param idVO 接口参数
     * @return 查询结果
     */
    Wrapper<VendorOrderDetailVO> getToConfirmOrderDetails(HttpHeaders headers, OrderIdVO idVO);

    /**
     * “待确认订单” - 确认
     * @param headers Http头部信息
     * @param agreeVO 接口参数
     * @return 查询结果
     */
    Wrapper<Void> confirmOrder(HttpHeaders headers, OrderAgreeVO agreeVO);

    /**
     * “待确认支付结果” - 查询订单列表
     * @param headers Http头部信息
     * @param pageVO 接口参数
     * @return 查询结果
     */
    Wrapper<PageData<VendorConfirmPayQueryVO>> pageToConfirmPayOrders(HttpHeaders headers, OrderValidatePageVO pageVO);

    /**
     * “待确认支付结果” - 查询订单详情
     * @param headers Http头部信息
     * @param idVO 接口参数
     * @return 查询结果
     */
    Wrapper<VendorOrderDetailVO> getToConfirmPayOrderDetails(HttpHeaders headers, OrderIdVO idVO);

    /**
     * “待确认支付结果” - 确认支付结果
     * @param headers Http头部信息
     * @param confirmPayVO 接口参数
     * @return 确认结果
     */
    Wrapper<Void> confirmOrderPayment(HttpHeaders headers, ConfirmPayVO confirmPayVO);

    /**
     * “待新增销售发货单” -查询订单列表
     * @param headers Http头部信息
     * @param pageVO  接口参数
     * @return 查询结果
     */
    Wrapper<PageData<VendorSellDeliveryPageVO>> pageSellDeliveryOrders(HttpHeaders headers, OrderSellDeliveryPageVO pageVO);

    /**
     * “待新增销售发货单” - 创建发货单
     * @param headers Http头部信息
     * @param orderVO 接口参数
     * @return 操作结果
     */
    Wrapper<Void> createSellDelivery(HttpHeaders headers, SellDeliveryOrderVO orderVO);

    /**
     * “待新增销售发货单” - 查看详情
     * @param headers Http头部信息
     * @param idVO    接口参数
     * @return 查询结果
     */
    Wrapper<VendorSellDeliveryDetailVO> getSellDeliveryDetail(HttpHeaders headers, OrderIdVO idVO);

    /**
     * “审核销售发货单” - 提交审核
     * @param headers Http头部信息
     * @param idVO    接口参数
     * @return 查询结果
     */
    Wrapper<Void> validateToSellDeliveryOrder(HttpHeaders headers, OrderIdVO idVO);

    /**
     * “待新增物流单” - 查询订单列表
     * @param headers Http头部信息
     * @param pageVO  接口参数
     * @return 查询结果
     */
    Wrapper<PageData<VendorLogisticsPageVO>> pageCreateLogistics(HttpHeaders headers, CreateLogisticsPageVO pageVO);

    /**
     * “待新增物流单” - 查看详情
     * @param headers Http头部信息
     * @param idVO    接口参数
     * @return 查询结果
     */
    Wrapper<VendorLogisticsDetailVO> getLogisticsDetail(HttpHeaders headers, OrderIdVO idVO);

    /**
     * “新增物流单” - 选择商品 - 发货单商品明细
     * @param headers Http头部信息
     * @param pageVO  接口参数
     * @return 查询结果
     */
    Wrapper<PageData<VendorLogisticsProductQueryVO>> pageLogisticsProducts(HttpHeaders headers, VendorLogisticsProductPageVO pageVO);

    /**
     * “待确认支付结果” - 确认支付结果
     * @param order        订单
     * @param confirmPayVO 接口参数
     * @param loginUser    登录用户
     * @return 确认结果
     */
    Wrapper<Void> confirmOrderPayment(OrderDO order, ConfirmPayVO confirmPayVO, UserLoginCacheDTO loginUser);

    /**
     * “待确认发货订单” -查询订单列表
     * @param headers Http头部信息
     * @param pageVO 接口参数
     * @return 查询结果
     */
    Wrapper<PageData<VendorDeliveryQueryVO>> pageToDeliveryOrders(HttpHeaders headers, OrderValidatePageVO pageVO);

    /**
     * “待确认发货订单” - 查询订单详情
     * @param headers Http头部信息
     * @param idVO 接口参数
     * @return 查询结果
     */
    Wrapper<VendorOrderDetailVO> getToDeliveryOrderDetails(HttpHeaders headers, OrderIdVO idVO);

    /**
     * “待确认发货订单” - “确认发货” - 查询商品列表
     * @param headers Http头部信息
     * @param idVO 接口参数
     * @return 查询结果
     */
    Wrapper<List<VendorDeliveryProductVO>> getToDeliveryProducts(HttpHeaders headers, VendorDeliveryNoAndOrderIdVO idVO);

    /**
     * “待确认发货订单” - 发货
     * @param headers Http头部信息
     * @param deliveryVO 接口参数
     * @return 操作结果
     */
    Wrapper<Void> deliveryOrder(HttpHeaders headers, VendorDeliveryVO deliveryVO);

    /**
     * “待确认发货订单” - 发货
     * @param loginUser 登录用户
     * @param order     发货订单
     * @param deliveryVO 接口参数
     * @return 操作结果
     */
    Wrapper<Void> deliveryOrder(UserLoginCacheDTO loginUser, OrderDO order, VendorDeliveryVO deliveryVO);

    /**
     * 代客下单 - 创建订单
     * @param headers HttpHeader信息
     * @param orderVO 接口参数
     * @return 操作结果
     */
    Wrapper<Void> createAgentOrder(HttpHeaders headers, AgentOrderVO orderVO);

    /**
     * 代客下单 - 查询支付方式与支付渠道列表
     * @param headers   Http头部信息
     * @param payTypeVO 接口参数
     * @return 查询结果
     */
    Wrapper<List<OrderPayTypeDetailVO>> findAgentOrderPayTypes(HttpHeaders headers, AgentOrderPayTypeVO payTypeVO);

    /**
     * 代客下单 - 根据企业商城类型获取下单模式和类型
     * @param headers Http头部信息
     * @param shopTypeVO 订单来源商城的类型
     * @return 查询结果
     */
    Wrapper<OrderModeVO> findAgentOrderModeTypes(HttpHeaders headers, OrderShopTypeVO shopTypeVO);

    /**
     * 代客下单 - 查询支付环节列表
     * @param headers Http头部信息
     * @param payVO   接口参数
     * @return 查询结果
     */
    Wrapper<List<BuyerOrderPayNodeDetailVO>> findAgentOrderProcessPayment(HttpHeaders headers, AgentOrderProcessPayVO payVO);

    /**
     * 订单查询 - 获取小程序二维码
     * @param headers Http头部信息
     * @param idVO    接口参数
     * @return 查询结果
     */
    Wrapper<String> createMiniAppCode(HttpHeaders headers, OrderIdVO idVO);

    /**
     * 订单分页查询 - 通用 - 所有订单类型下拉框列表
     * @return 查询结果
     */
    Wrapper<List<DropdownItem>> getAllOrderType();

    /**
     * “待确认回单订单” - 查询订单分页列表
     * @param headers Http头部信息
     * @param pageVO  接口参数
     * @return 查询结果
     */
    Wrapper<PageData<VendorReceiptOrderPageVO>> pageToConfirmReceiptOrders(HttpHeaders headers, OrderValidatePageVO pageVO);

    /**
     * “待确认回单订单” - 确认回单
     * @param headers Http头部信息
     * @param orderVO  接口参数
     * @return 查询结果
     */
    Wrapper<Void> confirmOrderReceipt(HttpHeaders headers, VendorBatchNoAndOrderIdVO orderVO);
}
